home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 20 / Cream of the Crop 20 (Terry Blount) (1996).iso / program / vbprnt20.zip / SRC / VBPRNT16.C < prev    next >
C/C++ Source or Header  |  1996-05-31  |  12KB  |  384 lines

  1. /* VBPRINT.DLL v2.0 Last Updated 05-30-1996 by Robert Simpson
  2.     This version designed for 16-bit Windows apps.
  3.  
  4.     NOTES
  5.     This program, though designed for Win3.x will work properly
  6.     with the expanded DEVMODE structure in Windows 95 and/or Win NT.
  7.     However, if you wish to access any of the extra items in the Win95
  8.     DEVMODE structure, I highly recommend using the full 32-bit version
  9.     of this DLL.
  10.  
  11.     The sample programs, DLL files and all source code have been released
  12.     to the public domain.
  13.  
  14.     This DLL was written and compiled in Borland C++ 4.5
  15. */
  16.  
  17. #include <windows.h>
  18. #include <string.h>
  19. #include <stdio.h>
  20. #include "vbapi.h"
  21. #include <stdlib.h>
  22. #include <math.h>
  23. #include <ctype.h>
  24. #include <dos.h>
  25. #include <print.h>
  26.  
  27. /*  Exported Functions are listed below, here are the proper VB declares:
  28.  
  29. Declare Function VBGetPrinters          Lib "vbprint.dll" () As String
  30. Declare Function VBGetDriverFromName  Lib "vbprint.dll" (printername As String) As String
  31. Declare Function VBSetDefPrinter          Lib "vbprint.dll" (printername As String) As Integer
  32. Declare Function VBGetDefPrinter          Lib "vbprint.dll" () As String
  33. Declare Function VBExtDeviceMode          Lib "vbprint.dll" (ByVal hWnd As Integer, printername As String, inDev As DEVMODE_TYPE, outDev As DEVMODE_TYPE, ByVal fMode As Integer) As Integer
  34. Declare Function VBDevModeToStr          Lib "vbprint.dll" (inDev As DEVMODE_TYPE) As String
  35. Declare Function VBStrToDevMode          Lib "vbprint.dll" (dmString As String, outDev As DEVMODE_TYPE) As Integer
  36. Declare Function VBDeviceCapabilities Lib "vbprint.dll" (printername As String, ByVal iCap As Integer, lpStr As Any, inDev As DEVMODE_TYPE) As Long
  37. Declare Function VBResetDC            Lib "vbprint.dll" (ByVal hDC As Integer, outDev As DEVMODE_TYPE) As Integer
  38.  
  39. ' Here is the VB DEVMODE that should be used in all calls to this DLL requiring a DEVMODE structure:
  40.  
  41. Type DEVMODE_TYPE
  42.   dmDeviceName As String * 32
  43.   dmSpecVersion As Integer
  44.   dmDriverVersion As Integer
  45.   dmSize As Integer
  46.   dmDriverExtra As Integer
  47.   dmFields As Long
  48.   dmOrientation As Integer
  49.   dmPaperSize As Integer
  50.   dmPaperLength As Integer
  51.   dmPaperWidth As Integer
  52.   dmScale As Integer
  53.   dmCopies As Integer
  54.   dmDefaultSource As Integer
  55.   dmPrintQuality As Integer
  56.   dmColor As Integer
  57.   dmDuplex As Integer
  58.   dmYResolution As Integer
  59.   dmTTOption As Integer
  60.   dmPrivate As String
  61. End Type
  62.  
  63. '  The DEVMODE_TYPE structure in VB is essentially a base DEVMODE structure with a dynamic
  64. '  string attached to the end (the C version is directly below, named VBDEVMODE) which
  65. '  holds the printer's private data (if there is any).
  66. */
  67.  
  68.  
  69. #define PRINTERLIST 2048 // Size of the buffer that holds the available printers
  70.  
  71. struct VBDEVMODE      // The C equivilent to the VB DEVMODE_TYPE structure above
  72. {
  73.   DEVMODE dm;        // The size of the DEVMODE structure is larger in Win95 than in Win31
  74.   HLSTR dmPrivate;   // To compensate for size differences, this dmPrivate area holds the extra data
  75. };                   // required by Win95 and by the specific printer driver (if it DOES require anything).
  76.  
  77. // Exported functions
  78. HLSTR FAR PASCAL _export VBGetPrinters();
  79. HLSTR FAR PASCAL _export VBGetDriverFromName(HLSTR printername);
  80. int   FAR PASCAL _export VBSetDefPrinter(HLSTR);
  81. HLSTR FAR PASCAL _export VBGetDefPrinter();
  82. int   FAR PASCAL _export VBExtDeviceMode(HWND,HLSTR,struct VBDEVMODE *,struct VBDEVMODE *,WORD);
  83. HLSTR FAR PASCAL _export VBDevModeToStr(struct VBDEVMODE *);
  84. int   FAR PASCAL _export VBStrToDevMode(HLSTR,struct VBDEVMODE *);
  85. long  FAR PASCAL _export VBDeviceCapabilities(HLSTR,WORD,LPSTR,struct VBDEVMODE *);
  86. int   FAR PASCAL _export VBResetDC(HDC, struct VBDEVMODE *);
  87.  
  88. // Internal functions
  89. int      GetDriverFromName(HLSTR,char *,char *,char *);
  90. DEVMODE *GetVBDevMode(struct VBDEVMODE *);
  91. void     SetVBDevMode(DEVMODE *,struct VBDEVMODE *);
  92.  
  93. typedef int (FAR PASCAL *ExtDeviceMode)(HWND,HANDLE,LPDEVMODE,LPSTR,LPSTR,LPDEVMODE,LPSTR,WORD);
  94. typedef DWORD (FAR PASCAL *DevCaps)(LPSTR,LPSTR,WORD,LPSTR,LPDEVMODE);
  95.  
  96. /* This function works similar to the VB Dir$() function.  The first time it is
  97.     called, it retrieves the list of installed printers and returns them one at a
  98.     time to VB.  Each call returns the next installed printer.  A NULL return value
  99.     indicates the end of the list. */
  100. HLSTR FAR PASCAL _export VBGetPrinters()
  101. {
  102.   static int prevcall;
  103.   static char printers[PRINTERLIST];
  104.   static char buff[256];
  105.   char printer[64];
  106.   char *driver;
  107.   char *port;
  108.   char output[128];
  109.   char *port2;
  110.  
  111.   if (*printers == 0)
  112.      {
  113.         if (prevcall == 1)
  114.           {
  115.              prevcall = 0;
  116.              return 0;
  117.           }
  118.         prevcall = 1;
  119.         GetProfileString("devices",NULL,"",printers,PRINTERLIST);
  120.      }
  121.   if (buff[0] != 0)
  122.      {
  123.         port = strchr(buff,',');
  124.         if (port == 0) return 0;
  125.         *port = 0;
  126.         port ++;
  127.         strncpy(printer,buff,(int)(port-buff));
  128.         printer[(int)(port-buff)] = 0;
  129.         driver = strchr(port,',');
  130.         if (driver == 0) return 0;
  131.         driver[0] = 0;
  132.         sprintf(output,"%s on %s",printer,port);
  133.         memmove(buff,driver+1,sizeof buff-(int)(driver-buff));
  134.      }
  135.   else
  136.      {
  137.         strcpy(printer,printers);
  138.         GetProfileString("devices",printer,"",output,sizeof output);
  139.         driver = strtok(output,",");
  140.         port = strtok(NULL,",");
  141.         port2 = strtok(NULL,",");
  142.         while (port2 != 0)
  143.           {
  144.              strcat(buff,printer);
  145.              strcat(buff,",");
  146.              strcat(buff,port2);
  147.              strcat(buff,",");
  148.              port2 = strtok(NULL,",");
  149.           }
  150.         sprintf(output,"%s on %s",printer,port);
  151.         memmove(printers,printers+strlen(printer)+1,PRINTERLIST-(strlen(printer)));
  152.      }
  153.   return VBCreateTempHlstr(output,strlen(output));
  154. }
  155.  
  156. /* This function returns the printer driver assigned to the specified printer.
  157.     It's of little use other than reference purposes.  The <printername> VB string
  158.     must follow the format "<printername> on <port>" such as "Epson Stylus COLOR on LPT1:"
  159.     This is the same format that VBGetPrinters() returns the available printers. */
  160. HLSTR FAR PASCAL _export VBGetDriverFromName(HLSTR name)
  161. {
  162.   char pname[80];
  163.   char driver[80];
  164.   char port[80];
  165.  
  166.   if (GetDriverFromName(name,pname,driver,port) != 0)
  167.      return VBCreateTempHlstr(driver,strlen(driver));
  168.   return 0;
  169. }
  170.  
  171. /* Internal function to parse the name of a printer and determine its driver and port.
  172.     The caller provides pointers for the name, driver and port that this function
  173.     will fill in */
  174. int GetDriverFromName(HLSTR name,char *pname,char *pdriver,char *pport)
  175. {
  176.   char printer[128];
  177.   char *port;
  178.   char *driver;
  179.   char iniprinter[128];
  180.   char *found;
  181.  
  182.   VBGetHlstr(name,printer,128);
  183.   if (strlen(printer) == 0) return 0;
  184.   found = strstr(printer," on ");
  185.   if (found == 0) return 0;
  186.   *found = 0;
  187.   GetProfileString("devices",printer,"",iniprinter,sizeof iniprinter);
  188.   if (iniprinter[0] == 0) return 0;
  189.   driver = strtok(iniprinter,",");
  190.   port = found+4;
  191.   strcpy(pname,printer);
  192.   strcpy(pdriver,driver);
  193.   strcpy(pport,port);
  194.   return -1;
  195. }
  196.  
  197. /* Sets the default Windows printer. */
  198. int FAR PASCAL _export VBSetDefPrinter(HLSTR printer)
  199. {
  200.   char newprinter[128];
  201.   char port[32];
  202.   char driver[32];
  203.   char name[32];
  204.  
  205.   if (GetDriverFromName(printer,name,driver,port) == NULL) return 0;
  206.  
  207.   sprintf(newprinter,"%s,%s,%s",name,driver,port);
  208.   WriteProfileString("windows","device",newprinter);
  209.   return -1;
  210. }
  211.  
  212. /* Gets the default Windows printer from the INI file and parses it */
  213. HLSTR FAR PASCAL _export VBGetDefPrinter()
  214. {
  215.   char *name;
  216.   char *port;
  217.   char inistring[128];
  218.   char final[128];
  219.  
  220.   GetProfileString("windows","device","",inistring,sizeof inistring);
  221.   if (inistring[0] == 0) return 0;
  222.   name = strtok(inistring,",");
  223.   port = strtok(NULL,",");
  224.   port = strtok(NULL,",");
  225.   sprintf(final,"%s on %s",name,port);
  226.   return VBCreateTempHlstr(final,strlen(final));
  227. }
  228.  
  229. /* Converts a VB DevMode structure to one long string so it can be saved to
  230.     disk easier. */
  231. HLSTR FAR PASCAL _export VBDevModeToStr(struct VBDEVMODE *inmode)
  232. {
  233.   DEVMODE *outmode;
  234.   int size;
  235.   HLSTR hlstr;
  236.  
  237.   size = inmode->dm.dmSize + inmode->dm.dmDriverExtra;
  238.   if (size < 0) re